scheme
>(load "ld-all.scm")



当前存在的两个问题：1、解决系统关键字不需要单独成为一个列表的问题，使用第七个字段是空来解决。2、解决别名后y表达式必须解析为符号的问题。现在被解析为函数。3、解决无参函数的外部传入数据赋值问题。使用括号：无参函数名(外部符号1：值1，...，外部符号n：值n)

已经实现：1、并且通过规定第七个字段为strip来制定关键字不作为关键字调用列表，而是作为脱去括号的符号存在。测试了reg-cyl正确。但是，需要规定cyl文件名必须是绝对路径和当前路径。否则，由于相对路径和用户根路径存在.和~符号，会出问题。后续可以采取措施转换为绝对路径处理。
已增加全局变量定义，并搭好支持各类lisp语言的框架。
已经实现：无参函数隐参调用，需要明确的规则：1、开始括号后必须紧跟变量名，分割变量和值的分隔符必须是：冒号。2、值后分隔符必须是分隔符和函数定义分隔符。3、最后一组变量：值后必须紧跟结束括号。
正在实现别名机制：几个考虑，在local字典、current字典、extern字典中，不允许有字典内重名符号。对于跨文件，尤其是已经定义的不同文件中出现的重名问题，使用别名机制：定义一个别名来指代其中一个符号，建立cyl-alias-list变量记录别名，当使用的符号是别名时，在进行cyl解释时，进行转换。算法是：对任意符号进行匹配，如果与cyl-alias-list中符号重名，则进行转换。首先将指代符号转换为全域符号：符号名@绝对路径名，同时，重新解释外部文件，将其目标文件名重新命名为：原文件名.调用符号类型.scm，依托cyl-alias-list查找源本符号，在解释时解释为全域符号，从而实现正确的跨文件调用。
cyl-alias-list结构：("指代符号名" "原符号名" 指代符号编码 原符号编码 全域符号名)
cyl-alias-file-list：("原符号所在文件绝对路径" ...)
cyl-load-file-list：("全局导入文件绝对路径名" ...)
cyl-local-symbol-dict-list：("符号名" 类型名 编码 最小参数 最大参数 值类型 值串)
针对函数内导入文件，符号名=@导入局部文件，类型名=导入文件 值类型=文件列表 值串=绝对路径文件名列表
("指代符号名" 别名 0 0 0 

正在实现多文件融合函数机制：为了减少代码的公共性，提出一个多文件融合函数的概念，含义是指如果一个函数定义中引用了外部文件的符号，而没有在全局的导入外部文件，可以认为外部文件是函数定义的局部信息，从而外部文件仅在函数内部有效，那么当前文件成为一个超越指定外部文件的更高符号空间的一员。而外部文件中的符号退缩为当前函数的内部符号集合。通过这样的多次操作，一些源本作为顶层函数的符号只有在特定的函数内部才有效，从而减少了在更高符号空间的符号冲突几率。这是一种变相实现层次化名字空间的方法。
在定义融合函数的时候，存在一个重要的问题，就是如何解决跨文件同名符号的调用问题：1、全部使用全域符号可以解决这个问题，但是会影响目标函数的可读性。2、简单地规定不允许在同级中使用重名符号。现在暂时规定为当前文件内部不允许同级符号重名，而跨文件引用外部符号，则load一个专门使用的scm文件，比如：原文件名.调用符号类型.scm。
逆向命名规则：在进行项目内调用时，不必要使用全域或者本机定义符号名。为了尽可能使用后验扩展符号名，我们做如下约定，当发现使用别名机制时，约定只要文件名路径使用不带点的相对路径，则起用逆向扩展名。这也意味着在下一层目录的文件中不可以调用上一层目录中的文件，也就是说，约定使用目录进行名字空间界定。

使用"注册，输出符号：sym1，sym2，...，symn。来指定输出符号。
所有输出符号使用文件名来增加后缀。文件名使用从项目名目录到当前文件所在目录的相对路径来表示。
使用"注册，输出项目路径：path。
cyl-output-symbol-path=path。
cyl-output-symbol-list：(sym1 sym2 sym3...)
只有在cyl-output-symbol-list中的符号才允许重名,使用别名处理。


2021年10月28日更新
解决了,()作为(list )函数的问题。
2021年10月29日更新
解决了未定义符号列表的清除问题。
2021年10月30日更新
解决了类似"[1]+[2]+[3]+[4]"的无限参数函数的识别和定义。把这种无限参数函数区分为使用lisp函数的形如"[a]+、..."函数，和使用cylisp函数的形如"[a]+[b]、...的函数。

"的"函数和"中的"函数
在定义数据结构后，比如"注册，数据结构，个人信息：(姓名 性别 出生日期：(年 月 日) 手机号码)。"
[张三]的[个人信息]==>'(张三 男 (1990 1 1) 13230001234)
[张三]的[手机号码]==>13230001234
[[张三]的[出生日期]]中的[年]==>1990
姓名==>(nth 0 个人信息) 性别==>(nth 1 个人信息) 出生日期==>(nth 3 个人信息) 年==>(nth 0 (nth 3 个人信息))
[a]的[b]==>如果b是数据结构名，a是数据结构的拥有者，那么比对数据结构与数据的匹配关系。如果匹配则建立层次数据库。

2021年11月3日更新
解决了get-cons和get-cons-atexp函数中处理字符常量时，字符是分隔符的问题。
2021年11月5日重要更新
解决了嵌套宏处理的问题。在macro-aux.scm的handle-key/macro-aux中增加了退出条件，由原来的：(or (eq? res-deli-st '结束分隔符)(eq? res-deli-st '语句终结分隔符))改成(or (eq? res-deli-st '结束分隔符)(and (not new-key)(eq? res-deli-st '语句终结分隔符)))
原来的条件遇到'语句终结分隔符会多一次回溯，导致上一层宏被错误终结。导致下面的关键字被错判为'函数名片段。

如何定义无限参数函数：在函数的定义中，需要定义apply函数和y表达式函数的书写方式。
(define (运行列表参数函数[*][*]、... 函数名 . 参数列表) (apply 函数名 参数列表))
函数名的书写方式：是用@函数名，还是使用#^常量？
如何表示无限参数?使用#^常量

无线参数函数调用：指的是形如：[a]、[b]、[c]的无限参数函数调用。如果是[a]+[b]+[c]+[d]转化成的[l]+、...或者[a]+[b]、...形式的无限参数调用则被称为无限参数y表达式汉书调用。
 
2021年11月13日更新
cy-eval函数不能清除全局变量cyl-line-begin，导致函数定义不能重复多次执行。修改cyl-aux中的pre-cyl-init函数。
2021年11月13日问题
发现一个不容易解决的问题：不能区分在y表达式中的s表达式首项到底是函数名还是宏中的数据.
这个对于lisp作为宿主语言没有影响，但是,对于后续再编译为c或者汇编则会产生重要影响.
2022年6月9日发现解决了def/err中的递归调用问题。这是一个重大问题。
2022年6月28日更新版本
1、更改了无限参数函数的规则：支持形如：[a]、[b]、[c]的函数调用，其定义形式：[a]、...，这种形式要求函数定义时最后参数必须是无限参数，即不能无限参数后跟固定参数。支持形如：[a]b[c]b[d]的函数调用，其定义形式可以是：[a]b...，也可以是：[a]b[c]...。第一种形式优先，只支持双目运算。
2、提供了生成cyl以后的函数定义调整。根据cyl生成所有函数的符号表，对于不调用本地函数的函数优先解析，不断重复遍历符号表，直到将所有函数符号全部解析，生成一个解析顺序。按照优先"注册"语句，然后函数定义，最后命令语句的顺序重建cyl，以cys后缀名保存新顺序文件。并以其作为生成目标文件的基础。
3、解决了注册宏后跟分隔符的cyl格式错误。
尚未解决的问题：对于局部函数的定义，需要将其父函数及其祖先函数的符号定义字典导出供局部函数匹配。所以，需要在局部函数之前定义祖先及其父函数。当前仅支持父函数字典。尚未处理祖先函数，需要定义祖先字典(cyl-ancestor-symbol-dict-list)，并修改匹配函数(find-current-coding-list)、导入函数(cyl-fn-coding-get)、导出函数(cyl-fn-coding-push)。

